<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/11/3 0003
 * Time: 15:47
 */

/**
 * 国际支付宝APP服务端接口
 * @link https://global.alipay.com/service/app_split_cn/8
 */
class GlobalMobileSecuritypayPayBuilder extends AlipayTradeBuilder
{

    public function __construct()
    {
        $this->params['payment_type'] = 1;
        $this->params['forex_biz'] = 'FP';
        //$this->params['product_code'] = 'NEW_WAP_OVERSEAS_SELLER';
    }

    /**
     * 服务器异步通知页面路径：支付宝服务器主动通知商户网站里指定的页面http路径。
     * @param $notify_url
     * @return $this
     */
    public function setNotifyUrl($notify_url)
    {
        $this->params['notify_url'] = $notify_url;
        return $this;
    }

    /**
     * 服务器异步通知页面路径：支付宝服务器主动通知商户网站里指定的页面http路径。
     * @return mixed
     */
    public function getNotifyUrl()
    {
        return $this->params['notify_url'];
    }

    /**
     * @return mixed|null 支付宝合作商户网站唯一订单号。
     */
    public function getOutTradeNo()
    {
        return isset($this->params['out_trade_no']) ? $this->params['out_trade_no'] : null;
    }

    /**
     * 支付宝合作商户网站唯一订单号。
     * @param string $out_trade_no
     * @return $this
     */
    public function setOutTradeNo($out_trade_no)
    {
        $this->params['out_trade_no'] = $out_trade_no;
        return $this;
    }

    /**
     * 商品的标题/交易标题/订单标题/订单关键字等。该参数最长为128个汉字
     * @return mixed|null
     */
    public function getSubject()
    {
        return isset($this->params['subject']) ? $this->params['subject'] : null;
    }

    /**
     * 商品的标题/交易标题/订单标题/订单关键字等。该参数最长为128个汉字
     * @param string $subject
     * @return $this
     */
    public function setSubject($subject)
    {
        $this->params['subject'] = $subject;
        return $this;
    }

    /**
     *  该笔订单的资金总额，单位为RMB-Yuan。取值范围为[0.01，100000000.00]，精确到小数点后两位。
     * @return float|null
     */
    public function getTotalFee()
    {
        return isset($this->params['total_fee']) ? $this->params['total_fee'] : null;
    }

    /**
     * 该笔订单的资金总额，单位为RMB-Yuan。取值范围为[0.01，100000000.00]，精确到小数点后两位。
     * @param float $total_fee
     * @return $this
     */
    public function setTotalFee($total_fee)
    {
        $this->params['total_fee'] = $total_fee;
        return $this;
    }

    /**
     * 标识客户端来源。参数值内容约定如下：appenv=”system=客户端平台名^version=业务系统版本”
     * @param string $appenv
     * @return $this
     */
    public function setAppEnv($appenv)
    {
        $this->params['appenv'] = $appenv;
        return $this;
    }

    /**
     * 标识客户端来源。参数值内容约定如下：appenv=”system=客户端平台名^version=业务系统版本”
     * @return null|string
     */
    public function getAppEnv()
    {
        return isset($this->params['appenv']) ? $this->params['appenv'] : null;
    }

    /**
     * 	卖家支付宝账号（邮箱或手机号码格式）或其对应的支付宝唯一用户号（以2088开头的纯16位数字） user number (16 single digits beginning with 2088).
     * @param string $seller_id
     * @return $this
     */
    public function setSellerId($seller_id)
    {
        $this->params['seller_id'] = $seller_id;
        return $this;
    }

    /**
     * 	卖家支付宝账号（邮箱或手机号码格式）或其对应的支付宝唯一用户号（以2088开头的纯16位数字） user number (16 single digits beginning with 2088).
     * @return null|string
     */
    public function getSellerId()
    {
        return isset($this->params['seller_id']) ? $this->params['seller_id'] : null;
    }


    /**
     * 结算币种
     *
     *  编码      币种 位数
     *  AUD	    澳元	    2
     *  CAD	    加拿大元	2
     *  CHF	    瑞士法郎	2
     *  DKK	    丹麦克朗	2
     *  EUR	    欧元	    2
     *  GBP	    英镑	    2
     *  HKD	    港币	    2
     *  JPY	    日元	    0
     *  KRW	    韩元	    0
     *  NOK	    挪威克朗	2
     *  NZD	    新西兰元	2
     *  SEK	    瑞典克朗	2
     *  SGD	    新币	    2
     *  THB	    泰铢	    2
     *  USD	    美元	    2
     * @param string $currency
     * @return $this
     */
    public function setCurrency($currency)
    {
        $this->params['currency'] = $currency;
        return $this;
    }

    /**
     * 结算币种
     * @return string
     */
    public function getCurrency()
    {
        return isset($this->params['currency']) ? $this->params['currency'] : null;
    }

    /**
     * 范围为0.01～1000000.00
     * 如果商户网站使用人民币进行标价就是用这个参数来替换total_fee参数，rmb_fee和total_fee不能同时使用
     * @param string $rmb_fee
     * @return $this
     */
    public function setRmbFee($rmb_fee)
    {
        $this->params['rmb_fee'] = $rmb_fee;
        return $this;
    }

    /**
     * 范围为0.01～1000000.00
     * 如果商户网站使用人民币进行标价就是用这个参数来替换total_fee参数，rmb_fee和total_fee不能同时使用
     * @return string
     */
    public function getRmbFee()
    {
        return isset($this->params['rmb_fee']) ? $this->params['rmb_fee'] : null;
    }

    /**
     * 	对一笔交易的具体描述信息。如果是多种商品，请将商品描述字符串累加传给body。
     * @param string $body
     * @return $this
     */
    public function setBody($body)
    {
        $this->params['body'] = $body;
        return $this;
    }

    /**
     * 	对一笔交易的具体描述信息。如果是多种商品，请将商品描述字符串累加传给body。
     * @return null|string
     */
    public function getBody()
    {
        return isset($this->params['body']) ? $this->params['body'] : null;

    }

    /**
     * 此为买家登陆到完成支付的有效时间
     * 示例：5m 10m 15m 30m 1h 2h 3h 5h 10h 12h 1d.
     * 默认12小时，最大15天。
     * @param string $it_b_pay
     * @return $this
     */
    public function setItBPay($it_b_pay)
    {
        $this->params['it_b_pay'] = $it_b_pay;
        return $this;
    }

    /**
     * 此为买家登陆到完成支付的有效时间
     * 示例：5m 10m 15m 30m 1h 2h 3h 5h 10h 12h 1d.
     * 默认12小时，最大15天。
     * @return string|null
     */
    public function getItBPay()
    {
        return isset($this->params['it_b_pay']) ? $this->params['it_b_pay'] : null;
    }

    /**
     * 分账信息
     * @link https://global.alipay.com/service/website_split_cn/28
     * @param array $split_fund_info
     * @return $this
     */
    public function setSplitFundInfo($split_fund_info)
    {
        $this->params['split_fund_info'] = json_encode($split_fund_info);
        return $this;
    }

    /**
     * 分账信息
     * @return null
     */
    public function getSplitFundInfo()
    {
        return isset($this->params['split_fund_info']) ? $this->params['split_fund_info'] : null;
    }

    /**
     *
     * @return string
     */
    public  function getServiceName()
    {
        return 'mobile.securitypay.pay';
    }

    public function getBizContent()
    {
        if(empty($this->params['subject']) || mb_strlen($this->params['subject']) > 128){
            throw new \Exception('参数【subject】不能为空且必须小于128个字符',50001);
        }
        if(empty($this->params['out_trade_no']) || strlen($this->params['out_trade_no']) > 64){
            throw new \Exception('参数【out_trade_no】不能为空，且必须小于64个字符');
        }
        if(empty($this->params['seller_id'])){
            throw new \Exception('参数【seller_id】不能为空');
        }
        if(empty($this->params['body'])){
            $this->params['body'] = $this->params['subject'] . ':' . $this->params['out_trade_no'];
        }

        return parent::getBizContent();
    }
}